"""
File: example_1.py
Project: 1_绘制生日人数柱状图
File Created: 2020/02/12 14:32:37
Author: Dunmore (fovd2020@outlook.com)
-----------------------------------------------
Description:
1.2 思考与练习 提高部分 1.绘制生日人数柱状图
用matplotlib将班级成员生日人数绘制成柱状图
-----------------------------------------------
"""

import os
import xlrd
import matplotlib.pyplot as plt

# 获取文件所在的路径
CURRRENT_DIR = (
    os.path.dirname(__file__) if "__file__" in locals() else os.getcwd()
)


def read_birthday_data():
    """从Excel中读取班级成员出生月份信息，统计每个月的同学个数并返回

    Returns:
        [list]: 每个月份班级同学生日个数，[1:2,2:1...]
    """

    data = dict.fromkeys(list(range(1, 13)), 0)

    workbook = xlrd.open_workbook(os.path.join(CURRRENT_DIR, "班级成员档案.xls"))
    sheet = workbook.sheet_by_index(0)
    # 获取生日一列的坐标
    birthday_col = sheet.row_values(0).index("生日")
    for i in range(1, sheet.nrows):
        # 获取改行记录的生日并提取出其中的月份，计数加1
        month = int(sheet.row_values(i)[birthday_col][4:6])
        data[month] += 1

    return data


def main():
    data = read_birthday_data()

    # 替换字体以解决中文乱码的问题
    plt.rcParams["font.sans-serif"] = ["SimHei"]

    # 创建柱形图，x轴为月份:data.keys()，y轴为个数:data.values()
    plt.bar(data.keys(), data.values(), color="red", label="当月过生日的同学个数")

    # 设置x轴和y轴的名称，y轴旋转角度设置为0，默认为90
    plt.xlabel("月份")
    plt.ylabel("个数", rotation=0)

    # 设置x轴坐标刻度为1~12月
    plt.xticks(list(data.keys()))
    # 设置Y轴坐标刻度为0到最多月份的成员个数
    plt.yticks(list(range(0, max(data.values()) + 1)))

    # 设置图例
    plt.legend(loc="upper right")

    # 每个图形显示值
    for x, y in zip(data.keys(), data.values()):
        plt.text(x, y + 0.01, y, ha="center", va="bottom", fontsize=9)

    plt.show()


if __name__ == "__main__":
    main()
